#ifndef AABBCLIPPER_H
#define AABBCLIPPER_H

#include "vector2d.hpp"
#include "line.hpp"
#include <algorithm>

class AABBClipper{
	public:

		AABBClipper(Vector2d _A,Vector2d _B):
			A(std::min(_A.x,_B.x),std::min(_A.y,_B.y))
		,	B(std::max(_A.x,_B.x),std::max(_A.y,_B.y))
		{}

		bool clip(Vector2d& p1,Vector2d& p2)
		{
			if(p1.x>p2.x) std::swap(p1,p2);		// tylko przypadki od lewej do prawej

			if(p2.x<A.x)						// jeżeli prawy punkt jest poza lewym bokiem
			{
				return false;					// niema nic wewnatrz
			}
			if(p1.x>B.x)						// jeżeli lewy punkt jest poza prawym bokiem
			{
				return false;					// niema nic wewnatrz
			}
			Line l(p1,p2);						// bedzie potrzebna prosta

			if(p1.x<A.x)						// jeżeli lewy punkt jest poza lewym bokiem
			{
				p1 = Vector2d(A.x,l.gety(A.x));	// to obcinamy znajdujac punkt przeciecia odcinka z lewym bokiem
			}
			if(p2.x>B.x)						// jeżeli prawy punkt jest poza prawym bokiem
			{
				p2 = Vector2d(B.x,l.gety(B.x));	// to obcinamy znajdujac punkt przeciecia odcinka z prawym bokiem
			}
			if(p1.y>p2.y) std::swap(p1,p2);		// tylko przypadki od góry do dołu

			if(p2.y<A.y)						// jeżeli dolny punkt jest poza górnym bokiem
			{
				return false;					// niema nic wewnatrz
			}
			if(p1.y>B.y)						// jeżeli górny punkt jest poza dolnym bokiem
			{
				return false;					// niema nic wewnatrz
			}
			if(p1.y<A.y) 						// jeżeli górny punkt jest poza górnym bokiem
			{
				Vector2d py(l.getx(A.y),A.y);	// znajdujemy punkt przeciecia odcinka z górnym bokiem
				if((py.x>A.x)&&(py.x<B.x))		// jezeli jest pomiedzy prawym i lewym bokiem
				{
					p1 = py;					// to obcinamy do tego punktu
				}
			}
			if(p2.y>B.y)						// jeżeli dolny punkt jest poza dolnym bokiem
			{
				Vector2d py(l.getx(B.y),B.y);	// znajdujemy punkt przeciecia odcinka z dolnym bokiem
				if((py.x>A.x)&&(py.x<B.x))		// jezeli jest pomiedzy prawym i lewym bokiem
				{
					p2 = py;					// to obcinamy do tego punktu
				}
			}
			return p1 != p2;					// jeżeli jest jakiś odcinek a nie punkt to jest wewnątrz
		}
	public:
		Vector2d A;
		Vector2d B;

};

#endif // AABBCLIPPER_H
